package com.xigege.nio.bufferAndChannel;

import java.io.RandomAccessFile;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;

/**
 * MappedByteBuffer可以让文件直接在内存中（堆外内存）修改，操作系统不需要拷贝一次
 * 操作系统级别的修改，效率比较高
 */
public class MappedByteBufferTest {
    public static void main(String[] args)throws Exception {
        RandomAccessFile randomAccessFile = new RandomAccessFile("1.txt", "rw");//模式为读写

        //获取对应的文件通道
        FileChannel channel = randomAccessFile.getChannel();

        /**
         * 参数1：FileChannel.MapMode.READ_WRITE 使用读写模式
         * 参数2:  0  可以直接修改的起始位置
         * 参数3： 5  是映射到内存的大小（不是索引），即将 1.txt的多少个字节映射到内存
         * 可以直接修改的范围就是 0-5；
         * MappedByteBuffer是抽象类  实际的类型是DirectByteBuffer
         */
        MappedByteBuffer mappedByteBuffer = channel.map(FileChannel.MapMode.READ_WRITE, 0, 5);
        mappedByteBuffer.put(0, (byte) 'H');
        mappedByteBuffer.put(3, (byte) '9');
        mappedByteBuffer.put(5, (byte) 'Y');//IndexOutOfBoundsException

        randomAccessFile.close();
        System.out.println("修改成功");
    }
}
